home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 551-575 / disk_570 / gadtoolsbox / source / source.lha / CheckBox.c < prev    next >
C/C++ Source or Header  |  1991-11-04  |  15KB  |  479 lines

  1. /*-- AutoRev header do NOT edit!
  2. *
  3. *   Program         :   CheckBox.c
  4. *   Copyright       :   © Copyright 1991 Jaba Development
  5. *   Author          :   Jan van den Baard
  6. *   Creation Date   :   05-Oct-91
  7. *   Current version :   1.00
  8. *   Translator      :   DICE v2.6
  9. *
  10. *   REVISION HISTORY
  11. *
  12. *   Date          Version         Comment
  13. *   ---------     -------         ------------------------------------------
  14. *   05-Oct-91     1.00            CheckBox editor.
  15. *
  16. *-- REV_END --*/
  17.  
  18. #include "GTEd.h"
  19. #include "Protos.h"
  20.  
  21. /*
  22.  * --- External referenced data
  23.  */
  24. extern ULONG                Class;
  25. extern UWORD                Code;
  26. extern struct Gadget       *Object;
  27. extern APTR                 MainVisualInfo;
  28. extern struct TextAttr      Topaz80;
  29. extern struct Screen       *MainScreen;
  30. extern struct Window       *MainWindow;
  31. extern UWORD                ngFlags;
  32. extern WORD                 ngLeft, ngTop, ngWidth, ngHeight;
  33. extern UBYTE               *PlaceList[];
  34. extern UWORD                PlaceFlags[];
  35. extern struct ExtGadgetList Gadgets;
  36. extern struct MemoryChain  *Chain;
  37. extern BOOL                 Saved;
  38.  
  39. /*
  40.  * --- Gadget ID's
  41.  */
  42. #define GD_TEXT             0
  43. #define GD_LABEL            1
  44. #define GD_UNDERSCORE       2
  45. #define GD_DISABLED         3
  46. #define GD_CHECKED          4
  47. #define GD_HIGHLABEL        5
  48. #define GD_TEXTPLACE        6
  49. #define GD_OK               7
  50. #define GD_CANCEL           8
  51.  
  52. /*
  53.  * --- Module data
  54.  */
  55. struct Window              *ec_Wnd    = NULL;
  56. struct Gadget              *ec_GList  = NULL;
  57. struct Gadget              *ec_Gadgets[7];
  58. BOOL                        ec_Score   = FALSE, ec_Disabled = FALSE;
  59. BOOL                        ec_Checked = FALSE;
  60. WORD                        ec_Zoom[4];
  61.  
  62. struct TagItem              ec_nwTags[] = {
  63.     WA_Left,                0l,
  64.     WA_Top,                 0l,
  65.     WA_Width,               0l,
  66.     WA_Height,              0l,
  67.     WA_IDCMP,               IDCMP_CLOSEWINDOW | CYCLEIDCMP | BUTTONIDCMP | CHECKBOXIDCMP | IDCMP_REFRESHWINDOW | IDCMP_VANILLAKEY,
  68.     WA_Flags,               WFLG_DRAGBAR | WFLG_DEPTHGADGET | WFLG_CLOSEGADGET | WFLG_SMART_REFRESH | WFLG_ACTIVATE | WFLG_RMBTRAP,
  69.     WA_Gadgets,             0l,
  70.     WA_Title,               "Edit CHECKBOX gadget:",
  71.     WA_AutoAdjust,          TRUE,
  72.     WA_Zoom,                (Tag)ec_Zoom,
  73.     WA_CustomScreen,        0l,
  74.     TAG_DONE };
  75.  
  76. /*
  77.  * --- Create the CheckBox gadget.
  78.  */
  79. long MakeCheckBox( void )
  80. {
  81.     struct ExtNewGadget *eng  = 0l;
  82.     struct TagItem      *tags = 0l;
  83.  
  84.     if ( eng = AllocItem( Chain, (long)sizeof( struct ExtNewGadget ), MEMF_PUBLIC )) {
  85.         if ( tags = MakeTagList( 2l )) {
  86.  
  87.             eng->en_NumTags = 2l;
  88.             eng->en_Tags = tags;
  89.  
  90.             ChangeCheckBox( eng );
  91.  
  92.             RemoveAllGadgets();
  93.  
  94.             AddTail(( struct List * )&Gadgets, ( struct Node * )eng );
  95.  
  96.             Renumber();
  97.  
  98.             if ( RemakeAllGadgets())
  99.                 return TRUE;
  100.  
  101.             Remove(( struct Node * )eng);
  102.         }
  103.     }
  104.  
  105.     MyRequest( "Ahem....", "CONTINUE", "Out of memory !" );
  106.  
  107.     if ( tags )         FreeTagList( tags, 2l );
  108.     if ( eng  )         FreeItem( Chain, eng, (long)sizeof( struct ExtNewGadget ));
  109.  
  110.     return FALSE;
  111. }
  112.  
  113. /*
  114.  * --- Change the checkbox gadget.
  115.  */
  116. void ChangeCheckBox( struct ExtNewGadget *eng )
  117. {
  118.     struct TagItem      *tags;
  119.     UBYTE               *slab, *text, tn = 0;
  120.  
  121.     tags = eng->en_Tags;
  122.  
  123.     slab = (( struct StringInfo * )ec_Gadgets[ GD_LABEL ]->SpecialInfo )->Buffer;
  124.     text = (( struct StringInfo * )ec_Gadgets[ GD_TEXT  ]->SpecialInfo )->Buffer;
  125.  
  126.     eng->en_NewGadget.ng_LeftEdge   =   ngLeft;
  127.     eng->en_NewGadget.ng_TopEdge    =   ngTop;
  128.     eng->en_NewGadget.ng_Width      =   ngWidth;
  129.     eng->en_NewGadget.ng_Height     =   ngHeight;
  130.  
  131.     if ( strncmp( slab, "Gadget", 6 ) && strlen( slab )) {
  132.         strcpy( &eng->en_SourceLabel[0], slab );
  133.         eng->en_SpecialFlags |= EGF_USERLABEL;
  134.     } else
  135.         eng->en_SpecialFlags = 0l;
  136.  
  137.     if ( strlen( text )) {
  138.         strcpy( &eng->en_GadgetText[0], text );
  139.         eng->en_NewGadget.ng_GadgetText = &eng->en_GadgetText[0];
  140.         eng->en_NewGadget.ng_Flags      = ngFlags;
  141.     } else {
  142.         eng->en_NewGadget.ng_GadgetText = 0l;
  143.         eng->en_NewGadget.ng_Flags      = 0;
  144.     }
  145.  
  146.     eng->en_Kind    = CHECKBOX_KIND;
  147.  
  148.     if ( ec_Score && strlen( text )) {
  149.         tags[ tn   ].ti_Tag  = GT_Underscore;
  150.         tags[ tn++ ].ti_Data = (Tag)'_';
  151.     }
  152.  
  153.     if ( ec_Disabled )
  154.         eng->en_SpecialFlags |= EGF_DISABLED;
  155.  
  156.     if ( ec_Checked ) {
  157.         eng->en_SpecialFlags |= EGF_CHECKED;
  158.         tags[ tn   ].ti_Tag  = GTCB_Checked;
  159.         tags[ tn++ ].ti_Data = TRUE;
  160.     }
  161.  
  162.     tags[ tn ].ti_Tag = TAG_DONE;
  163.  
  164.     Saved = FALSE;
  165. }
  166.  
  167. /*
  168.  * --- Open the EditCheckBox requester.
  169.  */
  170. long EditCheckBox( WORD x, WORD y, WORD x1, WORD y1, struct Gadget *edit )
  171. {
  172.     struct Gadget       *g;
  173.     struct ExtNewGadget *e;
  174.     struct NewGadget     ng;
  175.     BOOL                 running = TRUE, ok = FALSE;
  176.     WORD                 l, t, w, h, btop, bleft, gw, gh;
  177.     UBYTE               *label = 0l, *slabel = 0l, gbuf[10];
  178.     UBYTE              **cycle;
  179.     Tag                  place = 0l;
  180.     UWORD                flag  = PLACETEXT_LEFT, high = FALSE, ID;
  181.  
  182.     cycle = &PlaceList[1];
  183.  
  184.     if ( edit ) {
  185.         e = FindExtGad( edit );
  186.  
  187.         x  = e->en_NewGadget.ng_LeftEdge;
  188.         y  = e->en_NewGadget.ng_TopEdge;
  189.         gw = e->en_NewGadget.ng_Width;
  190.         gh = e->en_NewGadget.ng_Height;
  191.  
  192.         label  = &e->en_GadgetText[0];
  193.         slabel = &e->en_SourceLabel[0];
  194.  
  195.         flag = e->en_NewGadget.ng_Flags;
  196.  
  197.         if ( flag & PLACETEXT_LEFT  ) place = 0l;
  198.         if ( flag & PLACETEXT_RIGHT ) place = 1l;
  199.         if ( flag & PLACETEXT_ABOVE ) place = 2l;
  200.         if ( flag & PLACETEXT_BELOW ) place = 3l;
  201.  
  202.         if ( flag & NG_HIGHLABEL )    high = TRUE;
  203.  
  204.         ec_Score = MyTagInArray( GT_Underscore, e->en_Tags );
  205.  
  206.         if (( e->en_SpecialFlags & EGF_DISABLED ) == EGF_DISABLED )
  207.             ec_Disabled = TRUE;
  208.         else
  209.             ec_Disabled = FALSE;
  210.  
  211.         if (( e->en_SpecialFlags & EGF_CHECKED ) == EGF_CHECKED )
  212.             ec_Checked = TRUE;
  213.         else
  214.             ec_Checked = FALSE;
  215.  
  216.     } else {
  217.         if ( x > x1 ) { gw = x; x = x1; x1 = gw; }
  218.         if ( y > y1 ) { gh = y; y = y1; y1 = gh; }
  219.  
  220.         gw = x1 - x + 1;
  221.         gh = y1 - y + 1;
  222.     }
  223.  
  224.     btop  = MainScreen->WBorTop + 1 + MainScreen->RastPort.TxHeight;
  225.     bleft = MainScreen->WBorLeft;
  226.  
  227.     w = bleft + MainScreen->WBorRight  + 300;
  228.     h = btop  + MainScreen->WBorBottom + 100;
  229.     l = (( MainScreen->Width  >> 1 ) - ( w >> 1 ));
  230.     t = (( MainScreen->Height >> 1 ) - ( h >> 1 ));
  231.  
  232.     ec_Zoom[0] = 0;
  233.     ec_Zoom[1] = btop;
  234.     ec_Zoom[2] = 200;
  235.     ec_Zoom[3] = btop;
  236.  
  237.     ec_nwTags[0 ].ti_Data = l;
  238.     ec_nwTags[1 ].ti_Data = t;
  239.     ec_nwTags[2 ].ti_Data = w;
  240.     ec_nwTags[3 ].ti_Data = h;
  241.     ec_nwTags[10].ti_Data = (Tag)MainScreen;
  242.  
  243.     if ( g = CreateContext( &ec_GList ))  {
  244.  
  245.         ng.ng_LeftEdge      =   bleft + 56;
  246.         ng.ng_TopEdge       =   btop + 4;
  247.         ng.ng_Width         =   236;
  248.         ng.ng_Height        =   12;
  249.         ng.ng_GadgetText    =   "_Text ";
  250.         ng.ng_TextAttr      =   &Topaz80;
  251.         ng.ng_GadgetID      =   GD_TEXT;
  252.         ng.ng_Flags         =   PLACETEXT_LEFT;
  253.         ng.ng_VisualInfo    =   MainVisualInfo;
  254.         ng.ng_UserData      =   0l;
  255.  
  256.         g = CreateGadget( STRING_KIND, g, &ng, GTST_String, (Tag)label, GTST_MaxChars, (Tag)GT_MAXLABELNAME + 1, GT_Underscore, (Tag)'_', TAG_DONE );
  257.  
  258.         SetStringGadget( g );
  259.  
  260.         ec_Gadgets[ GD_TEXT ] = g;
  261.  
  262.         ng.ng_TopEdge       =   btop + 20;
  263.         ng.ng_GadgetText    =   "_Label";
  264.         ng.ng_GadgetID      =   GD_LABEL;
  265.  
  266.         g = CreateGadget( STRING_KIND, g, &ng, GTST_String, (Tag)slabel, GTST_MaxChars, (Tag)GT_MAXLABEL + 1, GT_Underscore, (Tag)'_', TAG_DONE );
  267.  
  268.         SetStringGadget( g );
  269.  
  270.         ec_Gadgets[ GD_LABEL ] = g;
  271.  
  272.         ng.ng_LeftEdge      =   bleft + 96;
  273.         ng.ng_TopEdge       =   btop + 36;
  274.         ng.ng_GadgetText    =   "_Underscore";
  275.         ng.ng_GadgetID      =   GD_UNDERSCORE;
  276.  
  277.         g = CreateGadget( CHECKBOX_KIND, g, &ng, GTCB_Checked, (Tag)ec_Score, GT_Underscore, (Tag)'_', TAG_DONE );
  278.  
  279.         ec_Gadgets[ GD_UNDERSCORE ] = g;
  280.  
  281.         ng.ng_LeftEdge      =   bleft + 266;
  282.         ng.ng_GadgetText    =   "_Disabled";
  283.         ng.ng_GadgetID      =   GD_DISABLED;
  284.  
  285.         g = CreateGadget( CHECKBOX_KIND, g, &ng, GTCB_Checked, (Tag)ec_Disabled, GT_Underscore, (Tag)'_', TAG_DONE );
  286.  
  287.         ec_Gadgets[ GD_DISABLED ] = g;
  288.  
  289.         ng.ng_LeftEdge      =   bleft + 96;
  290.         ng.ng_TopEdge       =   btop + 51;
  291.         ng.ng_GadgetText    =   "_High Label";
  292.         ng.ng_GadgetID      =   GD_HIGHLABEL;
  293.  
  294.         g = CreateGadget( CHECKBOX_KIND, g, &ng, GTCB_Checked, (Tag)high, GT_Underscore, '_', TAG_DONE );
  295.  
  296.         ec_Gadgets[ GD_HIGHLABEL ] = g;
  297.  
  298.         ng.ng_LeftEdge      =   bleft + 266;
  299.         ng.ng_GadgetText    =   "Ch_ecked ";
  300.         ng.ng_GadgetID      =   GD_CHECKED;
  301.  
  302.         g = CreateGadget( CHECKBOX_KIND, g, &ng, GTCB_Checked, (Tag)ec_Checked, GT_Underscore, '_', TAG_DONE );
  303.  
  304.         ec_Gadgets[ GD_CHECKED ] = g;
  305.  
  306.         ng.ng_LeftEdge      =   bleft + 96;
  307.         ng.ng_TopEdge       =   btop + 66;
  308.         ng.ng_Width         =   196;
  309.         ng.ng_Height        =   13;
  310.         ng.ng_GadgetText    =   "Text _Place";
  311.         ng.ng_GadgetID      =   GD_TEXTPLACE;
  312.  
  313.         g = CreateGadget( CYCLE_KIND, g, &ng, GTCY_Labels, (Tag)cycle, GTCY_Active, place, GT_Underscore, (Tag)'_', TAG_DONE );
  314.  
  315.         ec_Gadgets[ GD_TEXTPLACE ] = g;
  316.  
  317.         ng.ng_LeftEdge      =   bleft + 8;
  318.         ng.ng_TopEdge       =   btop + 83;
  319.         ng.ng_Width         =   90;
  320.         ng.ng_GadgetText    =   "_OK";
  321.         ng.ng_Flags         =   PLACETEXT_IN;
  322.         ng.ng_GadgetID      =   GD_OK;
  323.  
  324.         g = CreateGadget( BUTTON_KIND, g, &ng, GT_Underscore, (Tag)'_', TAG_DONE );
  325.  
  326.         ng.ng_LeftEdge      =   bleft + 202;
  327.         ng.ng_GadgetText    =   "_CANCEL";
  328.         ng.ng_GadgetID      =   GD_CANCEL;
  329.  
  330.         g = CreateGadget( BUTTON_KIND, g, &ng, GT_Underscore, (Tag)'_', TAG_DONE );
  331.  
  332.         if ( g ) {
  333.  
  334.             ec_nwTags[6].ti_Data = (Tag)ec_GList;
  335.  
  336.             if ( ec_Wnd = OpenWindowTagList( 0l, ec_nwTags )) {
  337.  
  338.                 ec_Zoom[0] = l;
  339.                 ec_Zoom[1] = t;
  340.                 ec_Zoom[2] = w;
  341.                 ec_Zoom[3] = h;
  342.  
  343.                 GT_RefreshWindow( ec_Wnd, 0l );
  344.  
  345.                 do {
  346.                     WaitPort( ec_Wnd->UserPort );
  347.  
  348.                     while ( ReadIMsg( ec_Wnd )) {
  349.  
  350.                         switch ( Class ) {
  351.  
  352.                             case    IDCMP_REFRESHWINDOW:
  353.                                 GT_BeginRefresh( ec_Wnd );
  354.                                 GT_EndRefresh( ec_Wnd, TRUE );
  355.                                 break;
  356.  
  357.                             case    IDCMP_CLOSEWINDOW:
  358.                                 running = FALSE;
  359.                                 break;
  360.  
  361.                             case    IDCMP_GADGETUP:
  362.                                 switch( Object->GadgetID ) {
  363.  
  364.                                     case    GD_UNDERSCORE:
  365.                                         FlipFlop(  0l, 0l, 0l, &ec_Score );
  366.                                         break;
  367.  
  368.                                     case    GD_DISABLED:
  369.                                         FlipFlop( 0l, 0l, 0l, &ec_Disabled );
  370.                                         break;
  371.  
  372.                                     case    GD_CHECKED:
  373.                                         FlipFlop( 0l, 0l, 0l, &ec_Checked );
  374.                                         break;
  375.  
  376.                                     case    GD_HIGHLABEL:
  377.                                         FlipFlop( 0l, 0l, 0l, &high );
  378.                                         break;
  379.  
  380.                                     case    GD_TEXTPLACE:
  381.                                         if ( place++ == 3 )
  382.                                             place = 0;
  383.  
  384.                                         flag = PlaceFlags[ place + 1 ];
  385.                                         break;
  386.  
  387.                                     case    GD_OK:
  388.                                         Ok:
  389.                                         ok = TRUE;
  390.  
  391.                                     case    GD_CANCEL:
  392.                                         Cancel:
  393.                                         running = FALSE;
  394.                                         break;
  395.                                 }
  396.                                 break;
  397.  
  398.                             case    IDCMP_VANILLAKEY:
  399.                                 switch( Code ) {
  400.  
  401.                                     case    't':
  402.                                         ID = GD_TEXT;
  403.                                         goto Activate;
  404.  
  405.                                     case    'l':
  406.                                         ID = GD_LABEL;
  407.                                         goto Activate;
  408.  
  409.                                     case    'u':
  410.                                         FlipFlop( ec_Wnd, ec_Gadgets, GD_UNDERSCORE, &ec_Score );
  411.                                         break;
  412.  
  413.                                     case    'd':
  414.                                         FlipFlop( ec_Wnd, ec_Gadgets, GD_DISABLED, &ec_Disabled );
  415.                                         break;
  416.  
  417.                                     case    'h':
  418.                                         FlipFlop( ec_Wnd, ec_Gadgets, GD_HIGHLABEL, &high );
  419.                                         break;
  420.  
  421.                                     case    'e':
  422.                                         FlipFlop( ec_Wnd, ec_Gadgets, GD_CHECKED, &ec_Checked );
  423.                                         break;
  424.  
  425.                                     case    'p':
  426.                                         if ( place++ == 3 )
  427.                                             place = 0;
  428.  
  429.                                         flag = PlaceFlags[ place + 1 ];
  430.                                         GT_SetGadgetAttrs( ec_Gadgets[ GD_TEXTPLACE ], ec_Wnd, 0l, GTCY_Active, place, TAG_DONE );
  431.                                         break;
  432.  
  433.                                     case    'o':
  434.                                         goto Ok;
  435.  
  436.                                     case    'c':
  437.                                         goto Cancel;
  438.                                 }
  439.                                 break;
  440.                                 Activate:
  441.                                 ActivateGadget( ec_Gadgets[ ID ], ec_Wnd, 0l );
  442.                                 break;
  443.                         }
  444.                     }
  445.                 } while ( running );
  446.             }
  447.         }
  448.     }
  449.  
  450.     if ( ok) {
  451.         if ( high )  flag |= NG_HIGHLABEL;
  452.  
  453.         ngFlags     =   flag;
  454.         ngLeft      =   x;
  455.         ngTop       =   y;
  456.         ngWidth     =   gw;
  457.         ngHeight    =   gh;
  458.         if ( NOT edit )
  459.             ok = MakeCheckBox();
  460.         else {
  461.             RemoveAllGadgets();
  462.             ChangeCheckBox( e );
  463.             Renumber();
  464.             ok = RemakeAllGadgets();
  465.         }
  466.     } else if ( NOT edit )
  467.         Box( x, y, x1, y1 );
  468.  
  469.     if ( ec_Wnd )           CloseWindow( ec_Wnd );
  470.     if ( ec_GList )         FreeGadgets( ec_GList );
  471.  
  472.     ec_Wnd     = 0l;
  473.     ec_GList   = 0l;
  474.  
  475.     ClearMsgPort( MainWindow->UserPort );
  476.  
  477.     return( ok );
  478. }
  479.